package cn.ly.core.thread.pool;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import javax.swing.plaf.synth.SynthSeparatorUI;

/**
 * 
 * 线程池的好处：线程池里的每一个线程代码结束后，并不会死亡，而是再次回到线程池中成为空闲状态，等待下一个对象来使用。
 * 
 * 如何实现线程的代码呢?
 * 		A:创建一个线程池对象，控制要创建几个线程对象。
 * 			public static ExecutorService newFixedThreadPool(int nThreads)
 * 		B:这种线程池的线程可以执行：
 * 			可以执行Runnable对象或者Callable对象代表的线程
 * 			做一个类实现Runnable接口。
 * 		C:调用如下方法即可
 * 			Future<?> submit(Runnable task)
 *			<T> Future<T> submit(Callable<T> task)
 *		D:我就要结束，可以吗?
 *			可以。
 */

public class ExecutorsDemo {
	
	public static void main(String[] args) {
		Thread t;
		ExecutorService pool = Executors.newFixedThreadPool(3);//ExecutorService代表了一个线程池，他的动态真正类型是ThreadPoolExecutor，所以
		System.out.println(pool.getClass());            //ThreadPoolExecutor,就是一个线程池==>class java.util.concurrent.ThreadPoolExecutor
		Future f1 = pool.submit(()->{
			System.out.println("hello1");
		});
		try {
			System.out.println(f1.get());
			System.out.println(f1.cancel(true));//不一定成功，所以不好用
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		pool.execute(()->{
			System.out.println("hello2");
		});
		pool.execute(()->{
			System.out.println("hello3");
		});
		pool.shutdown();
	}

}
